package cn.song.freight.domain.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

/**
 * 操作日志实体类
 * 记录系统中所有的操作日志，包括添加、修改、删除、配置等操作
 *
 * @author SongRenShuo
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_operation_log")
@ApiModel(description = "操作日志数据对象")
public class OperationLogDO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键ID
     */
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键ID")
    private Long id;

    /**
     * 链路追踪ID，用于关联同一次操作的多条日志
     */
    @TableField("trace_id")
    @ApiModelProperty(value = "链路追踪ID，用于关联同一次操作的多条日志")
    private String traceId;

    /**
     * 模块类型：AREA(区域管理)、FREIGHT_STRATEGY(运费策略)等
     * @see cn.song.freight.enums.ModuleType
     */
    @TableField("module_type")
    @ApiModelProperty(value = "模块类型：AREA(区域管理)、FREIGHT_STRATEGY(运费策略)等")
    private String moduleType;

    /**
     * 操作类型：INSERT(新增)、UPDATE(修改)、DELETE(删除)等
     * @see cn.song.freight.enums.OperationType
     */
    @TableField("operation_type")
    @ApiModelProperty(value = "操作类型：INSERT(新增)、UPDATE(修改)、DELETE(删除)等")
    private String operationType;

    /**
     * 业务ID，关联的业务记录主键，多个ID用逗号分隔
     */
    @TableField("business_id")
    @ApiModelProperty(value = "业务ID，关联的业务记录主键，多个ID用逗号分隔")
    private String businessId;

    /**
     * 业务名称或描述
     */
    @TableField("business_name")
    @ApiModelProperty(value = "业务名称或描述")
    private String businessName;

    /**
     * 操作描述，详细说明本次操作的内容
     */
    @TableField("operation_description")
    @ApiModelProperty(value = "操作描述，详细说明本次操作的内容")
    private String operationDescription;

    /**
     * 操作前数据，JSON格式存储
     */
    @TableField("before_data")
    @ApiModelProperty(value = "操作前数据，JSON格式存储")
    private String beforeData;

    /**
     * 操作后数据，JSON格式存储
     */
    @TableField("after_data")
    @ApiModelProperty(value = "操作后数据，JSON格式存储")
    private String afterData;

    /**
     * 变更字段列表，JSON格式存储字段名和变更情况
     */
    @TableField("changed_fields")
    @ApiModelProperty(value = "变更字段列表，JSON格式存储字段名和变更情况")
    private String changedFields;

    /**
     * 请求参数，JSON格式存储
     */
    @TableField("request_params")
    @ApiModelProperty(value = "请求参数，JSON格式存储")
    private String requestParams;

    /**
     * 响应结果，JSON格式存储接口返回的code、msg等信息
     */
    @TableField("response_result")
    @ApiModelProperty(value = "响应结果，JSON格式存储接口返回的code、msg等信息")
    private String responseResult;

    /**
     * 请求方法：GET、POST、PUT、DELETE
     */
    @TableField("request_method")
    @ApiModelProperty(value = "请求方法：GET、POST、PUT、DELETE")
    private String requestMethod;

    /**
     * 请求URL
     */
    @TableField("request_url")
    @ApiModelProperty(value = "请求URL")
    private String requestUrl;

    /**
     * 请求IP地址
     */
    @TableField("request_ip")
    @ApiModelProperty(value = "请求IP地址")
    private String requestIp;

    /**
     * 用户代理信息
     */
    @TableField("user_agent")
    @ApiModelProperty(value = "用户代理信息")
    private String userAgent;

    /**
     * 操作人
     */
    @TableField("operator")
    @ApiModelProperty(value = "操作人")
    private String operator;

    /**
     * 操作时间
     */
    @TableField("operation_time")
    @ApiModelProperty(value = "操作时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date operationTime;

    /**
     * 执行耗时（毫秒）
     */
    @TableField("execution_time")
    @ApiModelProperty(value = "执行耗时（毫秒）")
    private Integer executionTime;

    /**
     * 操作状态：1-成功，2-失败
     */
    @TableField("status")
    @ApiModelProperty(value = "操作状态：1-成功，2-失败")
    private Integer status;

    /**
     * 错误信息，操作失败时记录
     */
    @TableField("error_message")
    @ApiModelProperty(value = "错误信息，操作失败时记录")
    private String errorMessage;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}
